#include <head.h>

// 定义信号量
sem_t sem;

// 声明线程函数
void * sem_func(void * val);

int main(int argc, char const *argv[])
{
    // 定义线程 tid 以及 id
    pthread_t Tid[10];
    int ID_arr[10] = {1,2,3,4,5,6,7,8,9,10}; // 线程内部使用 展示自己是几号线程
    int __errnum;
    // 初始化信号
    sem_init( &sem , 0 , 3 ); // 设置停车场 一次只能停 3 辆车 

    // 创建线程
    for (int  i = 0; i < 10; i++)
    {
    
        if (0 != (__errnum = pthread_create( &Tid[i] , NULL , sem_func , (void * )&ID_arr[i])))
        {
            printf("pthread_create error: %d %s\n" , __errnum , strerror(__errnum));
        }
        // 重置错误码 == 重置 系统中的 error 的值 perror 是可以直接获取的
        // 返回错误码 == 当函数出错时 返回错误码编号 strerror
    }
    

    // 回收线程
    for (int i = 0; i < 10; i++)
    {
        pthread_join(Tid[i] , NULL);
    }
    
    // 销毁信号
    sem_destroy(&sem);

    return 0;
}


// 定义线程函数
void * sem_func(void * val)
{
    int id = *((int *)val);
    printf("小车 %d 等待车位.....\n", id);
    // P操作
    sem_wait(&sem);

    // 线程开始工作
    printf("小车 %d 开始停车***>\n", id);
    sleep(2);
    printf("小车 %d 结束停车===>\n", id);

    // V操作
    sem_post(&sem);

    return NULL;
}
